##############
####FUNO####
##############

les<- function (x, atr,K , r, destaque)					#Criando a funo
{			
##Fazendo uma anlise exploratria nos argumentos				
  if(missing(K) & missing(r))              				#Analisando se o usurio colocou o arg r ou K
  {
    stop("Necessrio informar o argumento K ou r")			#Retornando uma msg caso o arg r ou K esteja faltando
  }
  if(missing(x))							#Analisando se o usurio colocou o arg x
  {
    stop("Necessrio informar o data.frame de entrada no argumento x")#Retornando uma msg caso o arg x esteja faltando
  }
  if(missing(atr))							#Analisando se o usurio colocou o arg atr
  {
    stop("Necessrio informar quais so os atributos a serem analisados no argumento atr") ##Retornando uma msg caso o argumento atr esteja faltando
  }
##Criando objeto que ser trabalhado dentro da funo
  atr.df<- data.frame(x[atr])                				#Transpondo os atributos do data.frame x para o data.frame atr.df
##Analisando qual ser o tamanho da janela grfica que ser necessria para plotar as relaes entre os atributos
  tam <- length(atr)                          				#Guardando a quantidade de atributos que o usurio ir anlisar
  lado<- sqrt(tam)                            				#Tirando a raiz da quantidade de atributos para montar a janela grfica                             
  hor <- ceiling(lado)                        				#A quantidade de grficos na horizontal sempre ser o valor da raiz arredondado para cima
  ver <- round(lado)                          				#A quantidade de grficos na vertical sempre ser o valor da raiz arredondada segundo a regra de arredondamento
  x11()                                       				#Abrindo janela grfica
  par(mfrow = c(hor,ver), bty = "l")                     		#Essa relao vai ajustar os grficos da forma mais prximo do timo para que eles no fiquem pequenos e ao mesmo tempo no sobrem "janelas vazias" 
##Vendo quais atributos esto correlacionados com o K, e converso dos valores dos atributos para o ndice
  if(!missing(K))                            				#Vendo se o usurio usou o arg K para indicar alguma estratgia
  {
    indice= data.frame(rep(NA,length(atr.df[,1])))			#Criando um data.frame para guardar os valores do ndice do ciclo
    for (i in 1:tam)                            			#Iniciando o ciclo que ir fazer os teste entre os atrs e o atr K
    {
      mod <- lm(K~atr.df[,i])                    			#Criando o modelo 
      suppressWarnings(teste <- anova(mod))				#Testando se o modelo  significativo, coloquei o comando suppressWarnings, pois um dos modelos ir analisar a relao entre a mesma coluna do data.frame de entrada, e nessa situao h a sada de uma warning message que no  necessria 
      nome.y <- colnames(atr.df)[i]					#Criando o nome que ser atribuido ao eixo y no plot do modelo
      titulo<- c("Valor do p" , round(teste$`Pr(>F)`, 3))		#Criando o nome que ser atribuido ao ttulo no plot do modelo que  o valor de p no teste anova
      plot(atr.df[,i]~K, ylab = as.graphicsAnnot(nome.y),  main = as.graphicsAnnot(titulo))  #Plotando a relao entre os atrs
      if(teste$`Pr(>F)`[1]<0.05)                			#Vendo se o modelo  significativo
      {
        if(mod$coefficients[2]>0)               			#Vendo se a relao entre os atributos  positiva
        {
          indice[i]= (atr.df[i]-min(atr.df[i]))/(max(atr.df[i])-min(atr.df[i])) #Calculando o indice para os atributos positivamente relacionados ao atr. K
        }
        else               						#Caso a relao entre os atributos seja negativa em relao a K
        {
          indice[i]= abs((atr.df[i]-min(atr.df[i]))/(max(atr.df[i])-min(atr.df[i]))-1) #Calculando o indice para os atributos negativamente relacionados ao atr. K
        }
      }
      else								#Caso a relao entre os atr no seja significativa 
      {
        indice[i]<- rep(NA, length(atr.df[i]))				#Atribuindo NAs ao data.frame pois a relao no  siginificativa
      }
    }
  }
##Vendo quais atributos esto correlacionados com o r, e converso dos valores dos atributos para o ndice, essa parte  muito parecida com a do K, s invertendo alguns sinais
  else									#Caso o usurio tenha usado o arg. r para indicar alguma estratgia
  {
    indice= data.frame(rep(NA,length(atr.df[,1])))			#Criando um data.frame para guardar os valores do ndice do ciclo
    for (i in 1:tam)                					#Iniciando o ciclo que ir fazer os teste entre os atrs e o atr r            
    {
      mod <- lm(r~atr.df[,i])                    			#Criando o modelo
      suppressWarnings(teste <- anova(mod))				#Testando se o modelo  significativo, coloquei o comando suppressWarnings, pois um dos modelos ir analisar a relao entre a mesma coluna do data.frame de entrada, e nessa situao h a sada de uma warning message que no  necessria
      nome.y <- colnames(atr.df)[i]					#Criando o nome que ser atribuido ao eixo y no plot do modelo
      titulo<- c("Valor do p" , round(teste$`Pr(>F)`, 3))		#Criando o nome que ser atribuido ao ttulo no plot do modelo que  o valor de p no teste anova
      plot(atr.df[,i]~r, ylab = as.graphicsAnnot(nome.y),  main = as.graphicsAnnot(titulo)) #Plotando a relao entre os atrs
      if(teste$`Pr(>F)`[1]<0.05)                			#Vendo se o modelo  significativo
      {
        if(mod$coefficients[2]<0)               			#Vendo se a relao entre os atributos  negativa
        {
          indice[i]= (atr.df[i]-min(atr.df[i]))/(max(atr.df[i])-min(atr.df[i])) ##Calculando o indice para os atributos negativamente relacionados ao atr. r
        }
        else               						#Caso a relao entre os atributos seja positiva em relao a r
        {
          indice[i]= abs((atr.df[i]-min(atr.df[i]))/(max(atr.df[i])-min(atr.df[i]))-1) #Calculando o indice para os atributos positivamente relacionados ao atr. r
        }
      }
      else								#Caso a relao entre os atributos no seja significativa
      {
        indice[i]<- rep(NA, length(atr.df[i]))				#Atribuindo NAs ao data.frame pois a relao no  siginificativa			
      }
    }
  }
##Ajuste do data.frame indice
  indice <- indice[,colSums(is.na(indice))<nrow(indice)]		#Excluindo as colunas com NAs (que no foram significativa)
  if(class(indice) == "numeric")					#Vendo se houve correlao com pelo menos mais um atributo para a contruo do ndice
  {
    stop("O atributo referente a estratgia no se relaciona com nenhum outro, insira outro atributo como referncia") #Retornando ao usurio o aviso de falta de correlao
  }
  indice$media<- apply(indice, 1, mean)					#Tirando a mdia do ndice dos atrs
  x$indice <- indice$media						#atribuindo o valor da mdia a mais uma coluna do data.frame de entrada
  if(missing(destaque))                                                 #Analisando se o usurio quis destacar os valores do ndice para categorias dos indivduos do data.frame
 {
    return(x)								#Retornando apenas o valor do ndice
  }
##Construo do boxplot com os valores do ndice por categoria
  as.factor(destaque)							#Convertendo a coluna de destaque em fatores
  x11()									#Abrindo uma janela grfica para expor ao usurio o valor do ndice em relao a caracterstica de destaque
  par(mfrow = c(1,1), bty = "l")					#Alterando os parmetros grficos
  boxplot(x$indice~destaque, ylab = "Indice de r a K") #Abrindo janela grfica
  return(x)								#Retornando ao usurio o data.frame de entrada com a coluna a mais com o valor do dice
}
